/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package src;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/**
 *
 * @author JMix
 */
public class Malla {
    
    private String nombre;
    private HashMap<Integer, ArrayList<Ramo>> ramos;
    private int duracion;
    private int orientacion;
    private String rutaGuardado;
    private ArrayList<Flecha> flechas;
    private int identificador;
    
    public Malla(String nombre, int duracion){
        this.rutaGuardado = "";
        this.duracion = duracion;
        this.nombre = nombre;
        this.ramos = new HashMap<>();
        this.orientacion = 0;
    }

    public int getOrientacion() {
        return orientacion;
    }

    public void setOrientacion(int orientacion) {
        this.orientacion = orientacion;
    }

    public int getIdentificador() {
        return identificador;
    }

    public void setIdentificador(int identificador) {
        this.identificador = identificador;
    }

    
    
    public int getDuracion() {
        return duracion;
    }

    public void setDuracion(int duracion) {
        this.duracion = duracion;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public String getRutaGuardado() {
        return rutaGuardado;
    }

    public void setRutaGuardado(String rutaGuardado) {
        this.rutaGuardado = rutaGuardado;
    }

    public Ramo getRamo(int nivel, String nombre){
        ArrayList<Ramo> ramosEnSemestre = ramos.get(nivel);
        if(ramosEnSemestre == null) return null; // no hay ramos en el nivel
        for (Ramo ramo : ramosEnSemestre){
            if (ramo.getNombre().equals(nombre)){
                return ramo;
            }
        }
        return null; // no se ha encontrado un ramo con ese nombre en ese nivel
    }
    
    public void addRamo(Ramo ramo){
        int nivel = ramo.getNivel();
        ArrayList<Ramo> ramosEnSemestre;
        ramosEnSemestre = ramos.get(nivel);
        if (ramosEnSemestre != null){
            ramosEnSemestre.add(ramo);
        }
        else {
            ramosEnSemestre = new ArrayList<>();
            ramosEnSemestre.add(ramo);
            ramos.put(nivel, ramosEnSemestre);
        }
    }

    public void eliminarRamo(Ramo ramo) {
        if (ramo != null){
            int nivel = ramo.getNivel();
            ArrayList<Ramo> ramosEnSemestre;
            ramosEnSemestre = ramos.get(nivel);
            ramosEnSemestre.remove(ramo);
        }
        this.eliminarPreRequisitos(ramo);
    }
    
    public HashMap getRamos()
    {
        return this.ramos;
    }

    int cantidadRamos() {
        int cantidad  = 0;
        Iterator it = ramos.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry e = (Map.Entry)it.next();
            cantidad += ramos.get(e.getKey()).size();
        }
        return cantidad;

    }

    public ArrayList<Ramo> getRamosNivel(int nivel) {
        return this.ramos.get(nivel);
    }
    
    void actualizarRamo(Ramo ramo, Ramo ramoModificado) {
        int nivel = ramo.getNivel();
        String nombre = ramo.getNombre();
        Ramo actual = this.getRamo(nivel, nombre);
        actual.setNombre(ramoModificado.getNombre());
        actual.setNivel(ramoModificado.getNivel());
        actual.setCredito(ramoModificado.getCreditos());
        actual.setTipo(ramoModificado.getTipo());
        actual.setRequisitos(ramoModificado.getPreRequisitos());
        actual.setRutaFicha(ramoModificado.getRutaFicha());
        actual.setHrsPresenciales(ramoModificado.getHrsPresenciales());
        actual.setHrsNoPresenciales(ramoModificado.getHrsNoPresenciales());
        actual.setPeriodo(ramoModificado.getPeriodo()); 
        
    }
    
    public void setFlechas(ArrayList<Flecha> flechas){
        this.flechas = flechas;
    }

    public ArrayList<Flecha> getFlechas() {
        return flechas;
    }

    /**
     * Elimina a ramo de la lista de prerequisitos de los otros ramos de la malla
     */
    private void eliminarPreRequisitos(Ramo ramo) {
        for (int nivel=0; nivel<this.duracion; nivel++){
            ArrayList<Ramo> ramosEnNivel = this.getRamosNivel(nivel);
            if (ramosEnNivel != null){
                for (Ramo r : ramosEnNivel){
                    if(r.tienePrerequisito(ramo)){
                        r.eliminarPreRequisito(ramo);
                    }
                }
            }
        }
    }

    /**
     * Elimina los requisitos de cada ramo
     */
    void eliminarPrerequisitos() {
        for (int nivel=0; nivel<this.duracion; nivel++){
            ArrayList<Ramo> enNivel = this.getRamosNivel(nivel);
            if (enNivel != null){
                for (Ramo r : enNivel){
                    r.eliminarPreRequisitos();
                }
            }
        }
    }
    
}
